﻿using DataLayer;
using DataLayer.BD;
using SupportLayer.Constantes.CLIENTE;
using SupportLayer.Constantes.Tabelas;
using SupportLayer.Objetos.Cliente;
using SupportLayer.ExtensionMethods;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SupportLayer.Objetos.Outros;
using SupportLayer.Constantes.OUTROS;

namespace BusinessLayer
{
	public class Cliente
	{
		Dictionary<string, object> parametros;
		#region Cidade
		public CidadeClass SelectCidade(Int64 ID, bool CarregaEstado = true)
		{
			parametros = new Dictionary<string, object>();
			parametros.Add(CIDADE.ID, ID);

			var lstCidades = new DataAccess().Select(new CidadeClass(), TABELAS.CIDADE, new string[] { "*" }, parametros).toCidadeClass();

			if ((lstCidades != null) && (lstCidades.Count > 0))
			{
				var cid = lstCidades[0];
				cid.Estado = new EstadoClass();
				//cid.Estado = 

				return lstCidades[0];
			}

			return null;
		}
		#endregion
		#region Cliente
		public int InsertCliente(ClienteClass Cliente)
		{
			return new DataAccess().Insert(Cliente, CLIENTE.ID, TABELAS.CLIENTE);
		}
		public ClienteClass SelectCliente(Int64 ID)
		{
			try
			{
				parametros = new Dictionary<string, object>();
				parametros.Add(CLIENTE.ID, ID);

				var lstCli = new DataAccess().Select(new ClienteClass(), TABELAS.CLIENTE, new string[] { "*" }, parametros).toClienteClass();

				if ((lstCli != null) && (lstCli.Count > 0)) return lstCli[0]; else return null;
			}
			catch (Exception)
			{
				throw;
			}
		}
		public ClienteClass SelectCliente(string Email, string Senha)
		{
			try
			{
				parametros = new Dictionary<string, object>();
				parametros.Add(CLIENTE.EMAIL, Email);
				parametros.Add(CLIENTE.SENHA, Senha);

				var cli = new DataAccess().Select(new ClienteClass(), TABELAS.CLIENTE, new string[] { "*" }, parametros).toClienteClass();

				if (cli != null) return cli[0]; else return null;
			}
			catch (Exception)
			{
				throw;
			}
		}
		public bool VerificaEmail(string Email)
		{
			try
			{
				parametros = new Dictionary<string, object>();
				parametros.Add(CLIENTE.EMAIL, Email);

				return new DataAccess().GetNumberOfMatchingRows(new ClienteClass(), TABELAS.CLIENTE, parametros) > 0;
			}
			catch (Exception)
			{

				throw;
			}
		}
		private ClienteClass ValidaCliente(ClienteClass Cliente)
		{
			try
			{
				if (Cliente == null)
					throw new ApplicationException("O Cliente não foi encontrado!");

				return Cliente;
			}
			catch (Exception)
			{
				throw;
			}
		}
		#endregion
		#region Carrinho
		public ClienteCarrinhoClass SelectCarrinho(Int64 ID)
		{
			try
			{
				parametros = new Dictionary<string, object>();
				parametros.Add(CLIENTE_CARRINHO.ID, ID);

				var lstCarrinho = new DataAccess().Select(new ClienteCarrinhoClass(), TABELAS.CARRINHO, new string[] { "*" }, parametros).toCarrinhoClass();

				if (lstCarrinho != null) return lstCarrinho[0]; else return null;
			}
			catch (Exception)
			{
				throw;
			}
		}
		public List<ClienteCarrinhoClass> GetCarrinhosPorCliente(Int64 ClienteID, bool CarregaCidade = true)
		{
			try
			{
				parametros = new Dictionary<string, object>();
				parametros.Add(CLIENTE_CARRINHO.CLIENTE_ID, ClienteID);

				return new DataAccess().Select(new ClienteCarrinhoClass(), TABELAS.CARRINHO, new string[] { "*" }, parametros).toCarrinhoClass();
			}
			catch (Exception)
			{
				throw;
			}
		}
		public void UpdateQuantidade(ClienteCarrinhoClass Carrinho)
		{
			try
			{
				string sql = string.Format("update {0} set {1} = {2} where {3} = {4}", 
												TABELAS.CARRINHO, CLIENTE_CARRINHO.QUANTIDADE, Carrinho.Quantidade, CLIENTE_CARRINHO.ID, Carrinho.ID);

				new Connection().Update(sql);
			}
			catch (Exception)
			{	
				throw;
			}
		}
		public void DeleteCarrinho(ClienteCarrinhoClass carrinho)
		{
			new DataAccess().Delete(TABELAS.CARRINHO, CLIENTE_CARRINHO.ID, carrinho.ID);
		}
		#endregion
		#region Estado
		public EstadoClass SelectEstado(Int64 ID)
		{
			try
			{
				parametros = new Dictionary<string, object>();
				parametros.Add(ESTADO.ID, ID);

				var lstEstados = new DataAccess().Select(new EstadoClass(), TABELAS.ESTADO, new string[] { "*" }, parametros).toEstadoClass();

				if ((lstEstados != null) && (lstEstados.Count > 0))
					return lstEstados[0];

				return null;
			}
			catch (Exception)
			{
				throw;
			}
		}
		#endregion
		#region Endereço
		public EnderecoClass SelectEndereco(Int64 EnderecoID, bool CarregaCidade = true)
		{
			try
			{
				parametros = new Dictionary<string, object>();
				parametros.Add(ENDERECO.ID, EnderecoID);

				List<EnderecoClass> lstEndereco = new DataAccess().Select(new EnderecoClass(), TABELAS.ENDERECO, new string[] { "*" }, parametros).toEnderecoClass();

				if ((lstEndereco != null) && (lstEndereco.Count > 0))
				{
					EnderecoClass end = lstEndereco[0];
					end.Cidade = new CidadeClass();
					end.Cidade = SelectCidade(end.CidadeID);

					return end;
				}
				else
					return null;
			}
			catch (Exception)
			{
				throw;
			}
		}
		public EnderecoClass SelectEnderecoAtivo(Int64 ClienteID, bool CarregaCidade = true)
		{
			try
			{
				parametros = new Dictionary<string, object>();
				parametros.Add(ENDERECO.CLIENTE_ID, ClienteID);
				parametros.Add(ENDERECO.ATIVO, "true");

				List<EnderecoClass> lstEndereco = new DataAccess().Select(new EnderecoClass(), TABELAS.ENDERECO, new string[] { "*" }, parametros).toEnderecoClass();

				if ((lstEndereco != null) && (lstEndereco.Count > 0))
				{
					EnderecoClass end = lstEndereco[0];
					end.Cidade = new CidadeClass();
					end.Cidade = SelectCidade(end.CidadeID);

					return end;
				}
				else
					return null;
			}
			catch (Exception)
			{
				throw;
			}
		}
		public List<EnderecoClass> GetEnderecoByClienteID(Int64 ClienteID)
		{
			try
			{
				parametros = new Dictionary<string, object>();
				parametros.Add(ENDERECO.CLIENTE_ID, ClienteID);

				return new DataAccess().Select(new EnderecoClass(), TABELAS.ENDERECO, new string[] { "*" }, parametros).toEnderecoClass();
			}
			catch (Exception)
			{
				throw;
			}
		}
		#endregion
		#region Pedidos
		public int InsertPedido(PedidosClass Pedido)
		{
			try
			{
				return new DataAccess().Insert(Pedido, PEDIDOS.ID, TABELAS.PEDIDOS);
			}
			catch (Exception)
			{
				throw;
			}
		}
		public List<PedidosClass> SelectPedidos(string CodigoPedido)
		{
			try
			{
				parametros = new Dictionary<string, object>();
				parametros.Add(PEDIDOS.CODIGO_PEDIDO, CodigoPedido);

				var lstCli = new DataAccess().Select(new PedidosClass(), TABELAS.PEDIDOS, new string[] { "*" }, parametros).toPedidoClass();

				if ((lstCli != null) && (lstCli.Count > 0)) return lstCli; else return null;
			}
			catch (Exception)
			{
				throw;
			}
		}
		#endregion
	}
}